/**
 * 小程序时间格式Y/m/d 
 * @param {*} date 
 */
export function dateFormat(date) {
	var reg = /(\d{4})\年(\d{2})\月(\d{2})\日/;
	var date = date.replace(reg, "$1-$2-$3");
	return date;
}

/**
 * 小程序ios兼容富文本溢出省略号显示 
 * @param {*} str 传入富文本
 */
export function ellipsisContent(str) {
	return `<div style="overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 3;-webkit-box-orient: vertical;word-break: break-all;">${convertIdeogramToNormalCharacter(str)}</div>`;
}

/**
 * 富文本解析 
 * @param {*} str 传入富文本
 */
export function convertIdeogramToNormalCharacter(str) {
	const arrEntities = {
		'lt': '<',
		'gt': '>',
		'nbsp': ' ',
		'amp': '&',
		'quot': '"'
	};
	return str.replace(/&(lt|gt|nbsp|amp|quot);/ig, function(all, t) {
		return arrEntities[t];
	});
}

/**
 * json转url参数 
 * @param {*} params 传入json格式数据 
 */
export function getQueryObject(params) {
	let types = Object.prototype.toString.call(params).slice(8, -1);
	if (types === 'Object') {
		let tempArr = [];
		for (let i in params) {
			let key = encodeURIComponent(i);
			let value = encodeURIComponent(params[i]);
			tempArr.push(key + '=' + value);
		}
		let urlParamsStr = tempArr.join('&');
		return urlParamsStr;
	} else {
		throw 'model is not object';
	}
}


/**
 * 节流函数封装  
 * @param {*} fn 传入一个函数
 * @param {*} gapTime 节流时间
 */
export function throttle(fn, gapTime) {
	if (gapTime == null || gapTime == undefined) {
		gapTime = 1500;
	}
	let _lastTime = null;
	// 返回新的函数
	return function() {
		let _nowTime = +new Date();
		if (_nowTime - _lastTime > gapTime || !_lastTime) {
			fn.apply(this, arguments); //将this和参数传给原函数
			_lastTime = _nowTime;
		} else {
			uniToast("您点击次数太频繁");
		}
	}
}

/**
 * 防抖函数封装
 * @param {*} fn 传入一个函数
 * @param {*} interval  防抖时间
 */
export function debounce(fn, interval) {
	let timer;
	let delay = interval || 1000; // 间隔的时间，如果interval不传，则默认1秒
	return function() {
		let that = this;
		let args = arguments; // 保存此处的arguments，因为setTimeout是全局的，arguments不是防抖函数需要的。
		if (timer) {
			clearTimeout(timer);
		}
		timer = setTimeout(function() {
			fn.apply(that, args); // 用apply指向调用debounce的对象，相当于this.fn(args);
		}, delay);
	};
}

/**
 * 计算两个日期之间相差天数
 * @param {*} date1 传入开始日期
 * @param {*} date2 传入结束日期
 */
export function subDateDays(date1, date2) {
	var a1 = Date.parse(new Date(timeParse(date1))); //任意格式日期转时间戳计算
	var a2 = Date.parse(new Date(timeParse(date2)));
	var day = parseInt((a2 - a1) / (1000 * 60 * 60 * 24));
	return day;
};

/**
 * 解析任意时间格式对象到Date 
 * @param {*} obj 传入任意日期格式
 */
export function timeParse(obj) {
	var date = null;
	if (obj instanceof Date) {
		if (String(obj) == 'Invalid Date')
			throw '传入了不可用的日期对象:' + String(obj);
		date = obj;
	} else if (typeof(obj) == 'string') {
		obj = obj.replace(/[年月]+/g, '-');
		obj = obj.replace(/[时分]+/g, ':');
		obj = obj.replace(/[日秒]+/g, '-');
		obj = obj.replace(/[\-\:]$/, '');
		obj = obj.replace(/(?=\s+)[\:\-]/, '');
		var time = Date.parse(obj);
		if (time) {
			date = new Date(time);
		} else {
			/* isNaN(date) */
			throw '日期格式错误:[' + obj + ']';
		}
	} else if (typeof(obj) == 'number') {
		if (!obj > 0) {
			throw '时间戳格式错误:[' + String(obj) + ']';
		}
		date = new Date(obj);
	} else {
		throw '未知的时间类型: ' + typeof(obj) + ",String():" + String(obj);
	}
	if (!date) {
		throw '未成功解析时间';
	}
	return date;
}

/**
 * 时间戳转日期格式
 * @param {*} time 传入时间戳 
 */
export function getDate(time) {
	let date = timeParse(time);
	let Y = date.getFullYear(); // 获取完整的年份(4位，1970)
	let M = date.getMonth() + 1; // 获取月份(0-11，0代表1月，用的时候记得加上1)
	let d = date.getDate();
	return Y + '-' + M + '-' + d;
}

/**
 * 封装local storage 
 * @param {string} key 传入键名
 * @param {*} value 传入值
 * @param {*} seconds 传入过期时间，默认30天
 */
export function myCache(key, value, seconds = 2592000) {
	let nowTime = Date.parse(new Date()) / 1000;
	if (key && value) {
		let expire = nowTime + Number(seconds);
		uni.setStorageSync(key, JSON.stringify(value) + '|' + expire)
		console.log('已经把' + key + '存入缓存,过期时间为' + expire)
	} else if (key && !value) {
		let val = uni.getStorageSync(key);
		if (val) {
			// 缓存存在，判断是否过期
			let temp = val.split('|')
			if (!temp[1] || temp[1] <= nowTime) {
				uni.removeStorageSync(key)
				console.log(key + '缓存已失效')
				return '';
			} else {
				return JSON.parse(temp[0]);
			}
		}
	}
}

/**
 * 设置cookie
 * @param name cookie的名称
 * @param value cookie的值
 * @param day cookie的过期时间
 */
export function setCookie(name, value, day) {
	if (day !== 0) {
		//当设置的时间等于0时，不设置expires属性，cookie在浏览器关闭后删除
		var expires = day * 24 * 60 * 60 * 1000;
		var date = new Date(+new Date() + expires);
		document.cookie =
			name + "=" + escape(value) + ";expires=" + date.toUTCString();
	} else {
		document.cookie = name + "=" + escape(value);
	}
}

/**
 * 获取对应名称的cookie
 * @param name cookie的名称
 * @returns {null} 不存在时，返回null
 */
export function getCookie(name) {
	var arr;
	var reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
	if ((arr = document.cookie.match(reg))) return unescape(arr[2]);
	else return null;
}

/**
 * 删除cookie
 * @param name cookie的名称
 */
export function delCookie(name) {
	setCookie(name, " ", -1);
}

/**
 * 保留两位小数 
 * @param {*} num 传入数值 
 */
export function keepTwoDecimal(num) {
	var result = parseFloat(num);
	if (isNaN(result)) {
		console.log("参数错误");
		return false;
	}
	result = Math.round(num * 100) / 100;
	return result;
}

/**
 * 弹出提示 
 * @param {*} title 传入提示词 
 * @param {*} icon 传入提示类型，默认无
 * @param {*} success 传入提示成功后回调函数
 */
export function uniToast(title, icon = "none", success) {
	uni.showToast({
		title,
		icon,
		success,
	});
}

/**
 * 路由跳转 
 * @param {*} url 传入url 
 */
export function uniJump(url) {
	uni.navigateTo({
		url,
	});
}

/**
 * 将本地图片转化为Base64，否则显示不出本地图片 
 * @param {*} file 传入选择图片返回的相对路径
 */
export function imageToBase64(file) {
	uni.getFileSystemManager().readFile({
		filePath: file,
		encoding: 'base64', //编码格式
		success: res => {
			console.log(res, '返回结果');
			return 'data:image/jpeg;base64,' + res.data;
		},
		fail: (e) => {
			console.log("图片转换失败");
		}
	});
}

/**
 * http请求模板封装 
 * @param {string} url 传入接口 
 * @param {*} data 传入数据 
 * @param {string} method 传入"POST" 或 "GET"
 */
export function template(url, data, method = "GET") {
	const host = "http://localhost:3000";
	return new Promise(function(resolve, reject) {
		const success = function(res) {
			// console.log(res);
			try {
				if (res.data.code == 200) {
					resolve(res.data);
				} else {
					reject("error:" + (res.data.errMsg || "返回错误信息字段msg缺失"));
				}
				return;
			} catch (e) {
				reject("except:" + JSON.stringify(e));
			}
		};
		const fail = function(err) {
			reject("fail:" + JSON.stringify(err));
		};
		uni.request({
			sslVerify: false,
			method,
			url: host + url,
			data,
			success,
			fail
		});
	});
}
